オブジェクトロックで保護されたS3バケットをCDKで構築する
現在、自分はProfllyというコミュニケーションハブサービスの開発を行っています。
その中で、以下のような要件のリソースを構築する必要がありました。
- とあるファイルを保管するS3バケット
- バケットに保管されたファイルの閲覧やAthenaでのデータクエリはしたいが、(一定期間)ファイルの更新・削除は不可としたい
この要件だとS3のオブジェクトロック機能が使うのが良さげだったので、今回はそちらを適用して対象のS3バケットを作成することにしました。
このエントリでは、オブジェクトロックで保護されたS3バケットをAWS CDKを利用して構築するサンプルをご紹介します。
なお、今回作成したサンプルはGitHubに公開しています。
amotz/object-locked-s3-cdk-sample
S3 オブジェクトロックとは
S3 オブジェクトロックは、いわゆるWrite Once Read Many (WORM) モデルを使用してオブジェクトを保存できる機能です。
S3バケットに保管されたオブジェクトに対し、オブジェクトの上書きや削除を一定期間or無期限に防止することができます。
ユースケースとしては、間違って削除されたくないファイルや改ざんを防止したいファイルの保護などが考えられます。
CDKを使ってオブジェクトロックで保護されたS3バケットを構築
それでは、早速CDKを利用してオブジェクトロックで保護されたS3バケットを構築していきます。
今回は、サンプルとして以下の条件でオブジェクトロックを適用します。
- リテンションモード: ガバナンスモード
- 保持期間: 1日
リテンションモードをコンプライアンスモードにした場合、対象のオブジェクトは保持期間中(rootユーザーであっても)削除できなくなります。デプロイ前にCDKのコードレビューや十分な内容確認をオススメします。
検証環境
- AWS CDK
1.103.0
- TypeScript
3.9.7
CDKのソースコード
実際のCDKのソースコードは以下のようになりました。
import * as cdk from '@aws-cdk/core'; import * as s3 from "@aws-cdk/aws-s3"; export class ObjectLockedS3CdkSampleStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucketName = "sample-object-locked-bucket-xxxxxxxxxxx" new s3.CfnBucket(this, "sampleObjectLockedBucket", { bucketName: bucketName, bucketEncryption: { serverSideEncryptionConfiguration: [ { serverSideEncryptionByDefault: { sseAlgorithm: "AES256" } } ] }, versioningConfiguration: { status: "Enabled" }, objectLockEnabled: true, objectLockConfiguration: { objectLockEnabled: "Enabled", rule: { defaultRetention: { mode: "GOVERNANCE", days: 1 } } } }); } }
CDKでは、s3.bucket
を利用してバケットを作成するケースが多いのではと思いますが、オブジェクトロック周りの設定は 2021/6/8 現在 High Level Constructでは提供されていないため、Low Level Constructである s3.cfnBucket
を利用して実装しています。
また、 objectLockEnabled
プロパティと objectLockConfiguration.objectLockEnabled
プロパティの型が微妙に違うのも若干のハマリポイントでした。。
デプロイ
コードが書けたので、CDKをデプロイしてみましょう。
$ cdk deploy
デプロイ完了後にマネジメントコンソールを確認すると、無事にオブジェクトロックが適用されたS3バケットが作成されています。
おわりに
CDKを使ってオブジェクトロックで保護されたS3バケットを構築する機会があったので、サンプルとしてブログを書きました。
CDKやCloudFormationを使って一発で構築できるのは便利ですが、S3のオブジェクトロックに関しては、思わぬ長期間の保持期間を設定したままバケットを作成してしまうなどの事故が起こりかねないので、デプロイ前に設定やソースコードを入念に確認しておきたいところです。
どなたかの参考になれば幸いです。